前言 :
昨天我們成功用一個字典 olist_db 把 9 張 CSV 表格優雅地收納進記憶體中。
現在資料準備就緒,面對這數據,第一步到底該如何做什麼?
很多新手的直覺是立刻匯入視覺化套件,想一口氣拉出每個月的銷售趨勢圖。
但我想在真實的業界當中如果盲目出圖往往是災難的開始。
在畫圖之前,我覺得更應該先摸清資料的「底細」,否則很容易踩到隱藏的地雷:
> 型態錯誤: 如果日期被存成了單純的字串(String),連最基本的「依月份群組」都做不到,圖表直接報錯。
> 邏輯空值: 如果為了畫圖而直接粗暴地略過空值(NaN),可能會不小心刪掉一堆有價值的特殊訂單,導致分析結果失真。
因為,在EDA(Exploratory Data Analysis, 簡稱 EDA(探索性資料分析))的起手式不是只單畫出圖表,而是先做"檢查"。
由於是 9 張表中的訂單主表 (orders) 是串聯所有邏輯的骨架,今天我們就從這來開刀!
昨天把資料都存在 olist_db 字典裡,現在讓我們去把訂單主表單獨抓出來,賦予它一個專屬變數,並印出前五筆看看長相:
# 從字典中取出訂單主表
orders = olist_db['olist_orders_dataset']
# 檢視前五筆資料,掌握大致樣貌
orders.head()
實戰圖片 如下

從印出的結果能看到,
這張表紀錄了每筆訂單(order_id)對應的客戶(customer_id)、訂單狀態(order_status),
以及一連串關鍵的時間點(下單、付款、發貨、送達)。
知道長什麼樣子後,我們要問:這張表有多大?
每個欄位儲存了什麼格式的資料?
在 Pandas 中,最實用的初步健檢函式就是 info():
# 檢視資料規模、欄位型態與非空值數量
orders.info()
實作區 :

仔細看執行結果的 Dtype(資料型態)欄位,我們馬上抓到第一個地雷!
這張表裡有 5 個與時間相關的欄位(例如:order_purchase_timestamp 購買時間),
但它們目前的型態全部都是 object(在 Pandas 中通常代表字串 String),而不是時間型態 datetime64。
這意味著電腦現在把它們當作純文字,如果不做轉換,我們後續完全無法計算「物流出貨究竟花了幾天」。
看完型態後,我們要來盤點「空值(NaN)」。我們用一行程式碼,快速統計每個欄位有多少個破洞:
# 統計每個欄位的空值數量
orders.isnull().sum()
實作區 :

執行後你會發現一個有趣的現象:
order_id、order_status 這幾個核心欄位都是 0 個空值。
但是,order_delivered_customer_date (送達顧客時間) 卻出現了 2965 個空值!
這時候不要急於想著下 dropna() 把這 2965 筆資料刪掉!
思考在真實的網購情境下:
只要訂單中途被「取消」,包裹沒出貨,自然就不會有「送達時間」。
那這些欄位的空著不是因為系統出錯,而是這件事「本身就沒發生」。
保留這些合理的空值,正是分析真實數據的關鍵!
今天先幫「訂單主表」做了一次全身檢查,並揪出兩個大問題:
1.假的時間: 時間欄位被當成一般字串儲存,無法計算天數,必須校正。
2.合理的留白 (空值): 缺少物流時間的訂單,必須根據它的「訂單狀態」來決定去留。
找出問題後就簡單了!
明天我們將正式動手,運用 Pandas 來處理這兩種麻煩,從原始資料打磨成可隨時分析的乾淨數據。
那我們 Day 5 見!